package com.bmw.seed.Interceptor;

import lombok.extern.slf4j.Slf4j;
import org.apache.commons.lang3.StringUtils;
import org.springframework.beans.factory.annotation.Value;
import org.springframework.stereotype.Component;
import org.springframework.web.servlet.HandlerInterceptor;
import org.springframework.web.servlet.ModelAndView;

import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;
import java.io.IOException;
import java.net.URLEncoder;

/**
 * Classname: LoginInterceptor
 * Package: com.bmw.seed.Interceptor
 * Description:
 *
 * @Author 王少伟
 * @Create 2024/1/30 22:03
 * @Version 1.8
 */
@Slf4j
@Component//声明为一个组件
public class LoginInterceptor implements HandlerInterceptor {
    //此处设置拦截所有，然后根据配置文件只拦截部分url,也可以直接在上面的urlPattern中拦截全部的url
    @Value("${auth.login.pattern}")
    private String urlPattern;
    //要跳转的登录的MockUrl,本例是在一个项目中，实际环境登录中心和业务中心一般是两个不同的项目，子域名都不一样
    @Value("${auth.login.loginUrl}")
    private String loginUrl;
    //本项目对应的前缀于域名
    @Value("${auth.login.host}")
    private String host;

    /**
     * 在请求处理之前进行调用（Controller方法调用之前）
     * 如果返回false时，被请求时，拦截器执行后面的操作
     * 如果返回为true时，请求将会继续执行后面的操作
     * @throws java.io.IOException
     */
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response,Object handler)throws IOException {
        HttpServletRequest httpRequest = (HttpServletRequest)  request;
        HttpServletResponse httpResponse = (HttpServletResponse) response;
        String url = httpRequest.getRequestURI();
        log.info("=====url:" + url);
        if(url.matches(urlPattern)){
            //需要拦截验证
            String user = (String) httpRequest.getSession().getAttribute("user");
            if (user != null){
                //不需要拦截
                return true;
            }else {
                //生成要跳转回来的url
                String requestUrl = getRequestUrl(httpRequest);
                //本例是在一个项目中，可以使用forward；实际环境登录中心和业务中心实在不同的两个项目，子域名都不一样，因此实际环境一般用redirect跳转的方式
                httpResponse.sendRedirect(loginUrl + "?url=" + requestUrl);
            }
        }

        return true;
    }

    /**
     * 请求处理之后调用，但是在视图被渲染之前（Controller方法调用之后）
     */
    @Override
    public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView){
        System.out.println("执行了TestInterceptor的afterCompletion的方法");
    }

    /**
     *在整个请求结束之后被调用，也就是DispathcherServlet，渲染了对应的视图之后执行（主要是进行资源清理工作）
     */
    private String getRequestUrl(HttpServletRequest request)throws IOException{
        //实际的host在跳转项目中都包含域名，也可能多个域名对应一个服务，为了集群方便，域名一般从配置文件中获取
        String requestURL = host + request.getRequestURI();
        String queryString = request.getQueryString();
        if(StringUtils.isEmpty(queryString)){
            return requestURL;
        }else {
            StringBuilder result = new StringBuilder();
            result.append(URLEncoder.encode(requestURL + "?","UTF-8"));
            String[] qsArray = queryString.split("&");
            String[] qsPair = null;
            if(qsPair != null && qsPair.length > 0){
                for (String qsKeyValue: qsArray) {
                    qsPair = qsKeyValue.split("=");
                    if(qsPair != null && qsPair.length == 2){
                        result.append(qsPair[0]).append(URLEncoder.encode("=","UTF-8"));
                        result.append(URLEncoder.encode(qsPair[1],"utf-8"));
                        result.append(URLEncoder.encode("&","UTF-8"));

                    }
                }
            }
            return result.toString();
        }
    }

}
